package com.ck.dao;

import com.ck.model.chuangke.vo.CkProgramExportVO;
import com.ck.model.chuangke.vo.CkProgramListVO;
import com.ck.model.common.Program;
import com.ck.model.common.vo.ProgramSimpleVO;
import com.ck.model.company.vo.*;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 节目
 *
 * @author linq
 */
public interface ProgramMapper {
    /**
     * 删除节目
     *
     * @param programId   节目主键
     * @param companyCode 商家编号
     * @return 影响行数
     */
    int deleteByPrimaryKey(@Param("programId") Long programId, @Param("companyCode") String companyCode);

    /**
     * 新增节目
     *
     * @param record 新增的节目
     * @return 影响行数
     */
    int insert(Program record);

    /**
     * 新增节目（字段值不为空的）
     *
     * @param record 新增的节目
     * @return 影响行数
     */
    int insertSelective(Program record);

    /**
     * 根据主键查询节目
     *
     * @param programId 节目主键
     * @return Program
     */
    Program selectByPrimaryKey(Long programId);

    /**
     * 根据主键个更新节目（不为空的字段）
     *
     * @param record 更新的节目
     * @return 影响行数
     */
    int updateByPrimaryKeySelective(Program record);

    /**
     * 根据主键更新节目
     *
     * @param record 更新的节目
     * @return 影响行数
     */
    int updateByPrimaryKey(Program record);

    /**
     * 创客节目列表分页查询
     *
     * @param programStatus 节目状态
     * @param companyCode   商家编号
     * @param programName   节目名称
     * @param startTime     赛选开始时间
     * @param endTime       赛选结束时间
     * @return page
     */
    Page<CkProgramListVO> listByPageCk(@Param("programStatus") Integer programStatus,
                                       @Param("companyCode") String companyCode,
                                       @Param("programName") String programName,
                                       @Param("startTime") Long startTime,
                                       @Param("endTime") Long endTime);

    /**
     * 商家节目列表分页查询
     *
     * @param companyCode   商家编号
     * @param programName   节目名称
     * @param programStatus 节目状态
     * @return page
     */
    Page<CpProgramListVO> listByPageCp(@Param("companyCode") String companyCode,
                                       @Param("programName") String programName,
                                       @Param("programStatus") Integer programStatus);

    /**
     * 商家节目的终端列表分页查询
     *
     * @param companyCode    商家编号
     * @param programVersion 节目版本号
     * @param deviceCode     终端机器码
     * @return page
     */
    Page<CpProgramDeviceListVO> deviceListByPage(@Param("companyCode") String companyCode,
                                                 @Param("programVersion") String programVersion,
                                                 @Param("deviceCode") String deviceCode);

    /**
     * 获取节目总数
     *
     * @param programStatus 节目状态 0：已审批，1：待审批，2：待发布，3：已过期, null:全部
     * @return
     */
    Long getProgramCount(@Param("programStatus") Integer programStatus);

    /**
     * 根据大区查询节目总数
     *
     * @param region 大区：东北NE，华北NC，华中CC，华东EC，华南SC，西北WN，西南WS
     * @return
     */
    Long getProgramCountByRegion(String region);

    /**
     * 商家节目的终端列表分页查询
     *
     * @param companyCode    商家编号
     * @param programVersion 节目版本号
     * @param deviceCode     终端机器码
     * @return page
     */
    Page<CpProgramDeviceListVO> listProgramDeviceByPage(@Param("companyCode") String companyCode,
                                                        @Param("programVersion") String programVersion,
                                                        @Param("deviceCode") String deviceCode);

    /**
     * 商家节目的终端下载统计
     *
     * @param companyCode    商家编号
     * @param programVersion 节目版本号
     * @param deviceCode     终端序列号
     * @return CpProgramDeviceCountVO
     */
    CpProgramDeviceCountVO getProgramDeviceCount(@Param("companyCode") String companyCode,
                                                 @Param("programVersion") String programVersion,
                                                 @Param("deviceCode") String deviceCode);

    /**
     * 修改节目状态
     *
     * @param programId     节目主键
     * @param programStatus 节目状态
     * @param updateTime    修改时间
     * @param companyCode   商家编号
     * @return 影响行数
     */
    int updateProgramStatus(@Param("programId") Long programId,
                            @Param("programStatus") Integer programStatus,
                            @Param("updateTime") Long updateTime,
                            @Param("companyCode") String companyCode);

    /**
     * 根据节目版本号统计节目终端
     *
     * @param programVersion 节目版本号
     * @return 统计数量
     */
    int countDeviceProgramByProgramVersion(@Param("programVersion") String programVersion);

    /**
     * 修改节目状态为已过期
     *
     * @param programVersion 节目版本号
     * @param updateTime     修改时间
     * @param overdueTime    过期时间
     * @param companyCode    商家编号
     * @return 影响行数
     */
    int updateProgramToExpired(@Param("programVersion") String programVersion,
                               @Param("updateTime") long updateTime,
                               @Param("overdueTime") long overdueTime,
                               @Param("companyCode") String companyCode);

    /**
     * 导出创客节目列表
     *
     * @param programStatus 节目状态
     * @param companyCode   商家编码
     * @param programName   节目名称
     * @param startTime     更新开始时间
     * @param endTime       更新结束时间
     * @return List<CkProgramExportVO>
     */
    List<CkProgramExportVO> listExportProgramCk(@Param("programStatus") Integer programStatus,
                                                @Param("companyCode") String companyCode,
                                                @Param("programName") String programName,
                                                @Param("startTime") Long startTime,
                                                @Param("endTime") Long endTime);

    /**
     * 根据节目版本号删除节目
     *
     * @param programVersion 节目版本号
     * @return 影响行数
     */
    int deleteByProgramVersion(String programVersion);

    /**
     * 逻辑删除节目
     *
     * @param programVersion 节目版本号
     * @param companyCode    商家编号
     * @return 影响行数
     */
    int deleteByProgramVersionWithDataStatus(@Param("programVersion") String programVersion,
                                             @Param("companyCode") String companyCode);

    /**
     * 修改节目添加状态
     *
     * @param programId   节目ID
     * @param addStatus   添加状态
     * @param updateTime  修改时间
     * @param companyCode 商家编号
     * @return 影响行数
     */
    int updateProgramAddStatus(@Param("programId") Long programId, @Param("addStatus") Integer addStatus,
                               @Param("updateTime") Long updateTime, @Param("companyCode") String companyCode);

    /**
     * 根据节目版本号，查询节目基础信息
     *
     * @param programVersions
     * @return
     */
    List<ProgramSimpleVO> getProgramSimpleInfoByVersion(@Param("programVersions") List<String> programVersions);

    /**
     * 商家-全部节目列表
     *
     * @param programStatus
     * @param companyCode
     * @param programName
     * @param startTime
     * @param endTime
     * @return
     */
    List<CpAllProgramExportVO> allProgramListCp(@Param("programStatus") Integer programStatus,
                                                @Param("companyCode") String companyCode,
                                                @Param("programName") String programName,
                                                @Param("startTime") Long startTime,
                                                @Param("endTime") Long endTime);

    /**
     * 商家-全部节目分页
     *
     * @param programStatus
     * @param companyCode
     * @param programName
     * @param startTime
     * @param endTime
     * @return
     */
    Page<CkProgramListVO> allProgramPageCp(@Param("programStatus") Integer programStatus,
                                           @Param("companyCode") String companyCode,
                                           @Param("programName") String programName,
                                           @Param("startTime") Long startTime,
                                           @Param("endTime") Long endTime);

    /**
     * 商家-单个节目列表
     *
     * @param companyCode 商家代码
     * @param programName 节目名称
     * @param programId   节目ID
     * @return
     */
    Page<CpSingleProgramVO> singleProgramListCp(@Param("companyCode") String companyCode,
                                                @Param("programName") String programName,
                                                @Param("programId") String programId);

    /**
     * 不通过节目
     *
     * @param programId   节目ID
     * @param updateTime  更新时间
     * @param reason      不通过原因
     * @param companyCode 商家编号
     * @return 影响行数
     */
    int notApprove(@Param("programId") Long programId, @Param("updateTime") long updateTime,
                   @Param("reason") String reason, @Param("companyCode") String companyCode);

    /**
     * 根据节目版本号查询节目
     *
     * @param programVersion 节目版本号
     * @return Program
     */
    Program selectByProgramVersion(String programVersion);

    /**
     * 根据数据状态和节目状态查询节目集合
     *
     * @param dataStatus    数据状态（0正常，1逻辑删除）
     * @param programStatus 节目状态(0：已审批，1：待审批，2：待发布，3：已过期)
     * @return List<Program>
     */
    List<Program> list(@Param("dataStatus") Integer dataStatus, @Param("programStatus") Integer programStatus);

    /**
     * 批量更新节目
     *
     * @param versionList 待更新的节目版本号集合
     * @param updateTime  更新时间
     * @param overdueTime 过期时间
     * @param companyCode 商家编号
     * @return 影响行数
     */
    int batchUpdateProgramToExpired(@Param("versionList") List<String> versionList, @Param("updateTime") long updateTime,
                                    @Param("overdueTime") long overdueTime, @Param("companyCode") String companyCode);

    /**
     * 查询节目数量（programStatus为null,查询节目总数）
     *
     * @param companyCode   商家编码
     * @param programStatus 节目状态
     * @return Long
     */
    Long countProgram(@Param("companyCode") String companyCode, @Param("programStatus") Integer programStatus);

    /**
     * 批量减去节目终端总数
     *
     * @param programVersionArr 节目版本号数组
     * @param minusCount        减去的数量
     * @return 影响行数
     */
    int batchMinusTotalCount(@Param("programVersionArr") String[] programVersionArr, @Param("minusCount") int minusCount);

    /**
     * 清除节目不通过原因
     *
     * @param companyCode 商家编号
     * @param programId   节目ID
     * @return 影响行数
     */
    int cleanProgramNoPassReason(@Param("companyCode") String companyCode, @Param("programId") Long programId);

    /**
     * 根据节目名称和商家编号统计节目数量
     *
     * @param programName 节目名称
     * @param companyCode 商家编号
     * @return 条数
     */
    int countByProgramName(@Param("programName") String programName, @Param("companyCode") String companyCode);

    /**
     * 通过节目
     *
     * @param programId   节目ID
     * @param updateTime  更新时间
     * @param companyCode 商家编号
     * @return 影响行数
     */
    int approve(@Param("programId") Long programId,
                @Param("updateTime") long updateTime,
                @Param("companyCode") String companyCode);

    /**
     * 通过节目版本号查询节目ID和名称
     *
     * @param programVersionArr 节目版本号数组
     * @return 返回格式：1,2;节目1,节目2
     */
    String selectProgramIdAndNameByVersions(String[] programVersionArr);
}